<?php

declare(strict_types=1);

namespace app\traits;

use think\Exception;
use think\facade\Db;
use think\response\Json;

/**
 * API公共方法trait
 * Trait ApiTrait
 * @package app\traits
 */
trait ApiTrait
{
    /**
     * 获取数据前的处理逻辑
     */
    private function beforeIndex(): void
    {
    }

    /**
     * 数据列表及分页获取
     * @return Json
     * @throws \Exception
     */
    public function index(): Json
    {
        $this->beforeIndex();
        $this->getList();
        $this->afterIndex();
        return success($this->data);
    }

    /**
     * 获取数据后的处理逻辑
     */
    private function afterIndex(): void
    {
    }

    /**
     * 新增前的处理逻辑
     */
    private function beforeAdd(): void
    {
    }

    /**
     * 新增记录
     * @return Json
     */
    public function add(): Json
    {
        return $this->executeInTransaction(function () {
            $this->beforeAdd();
            if (empty($this->params)) {
                \exception('添加的数据不能为空');
            }
            $this->create();
            $this->afterAdd();
        });
    }


    /**
     * 新增后的处理逻辑
     */
    private function afterAdd(): void
    {
    }


    /**
     * 修改前的处理逻辑
     */
    private function beforeEdit(): void
    {
    }

    /**
     * 修改记录
     * @return Json
     */
    public function edit(): Json
    {
        return $this->executeInTransaction(function () {
            $this->beforeEdit();
            if (empty($this->params)) {
                \exception('更新的数据不能为空');
            }
            $this->update();
            $this->afterEdit();
        });
    }


    /**
     * 修改后的处理逻辑
     */
    private function afterEdit(): void
    {
    }


    /**
     * 详情前的处理逻辑
     */
    private function beforeGetInfo(): void
    {
    }

    /**
     * 获取详情
     * @return Json
     */
    public function getInfo(): Json
    {
        $this->beforeGetInfo();
        if(empty($this->where)){
            if(empty($this->id)){
                return error('请传递查询条件');
            }
            $this->where[] = ['id','=',$this->id];
        }
        $this->getOne();
        $this->afterGetInfo();
        return success($this->data);
    }

    /**
     * 详情后的处理逻辑
     */
    private function afterGetInfo(): void
    {
    }

    /**
     * 删除前的处理逻辑
     */
    private function beforeDel(): void
    {
    }

    /**
     * 删除记录
     * @return Json
     */
    public function del(): Json
    {
        return $this->executeInTransaction(function () {
            $this->beforeDel();
            $this->destroy();
            $this->afterDel();
        });
    }


    /**
     * 删除后的处理逻辑
     */
    private function afterDel(): void
    {
    }


    /**
     * 批量删除前的处理逻辑
     */
    private function beforeBatchDel(): void
    {
    }


    /**
     * 批量删除数据
     * @return Json
     */
    public function batchDel(): Json
    {
        return $this->executeInTransaction(function () {
            $this->beforeBatchDel();
            $this->destroy();
            $this->afterBatchDel();
        });
    }


    /**
     * 批量删除后的处理逻辑
     */
    private function afterBatchDel(): void
    {
    }


    /**
     * 修改状态
     */
    public function changeStatus(): Json{
        $res = $this->model->update($this->params,['id'=>$this->id]);
        if($res === false){
            return error('更新失败');
        }
        return success('更新成功');
    }
}